#include "./Driver/Debug_Driver/debug_driver.h"
#include "./BSP/WWDG_BSP/wwdg_bsp.h"
#include "./APP/app_bootloader.h"

WHT_WWDG_Config_t WWDG_Config = {36000, 10, 50, ENABLE};

static void Hardware_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);   //重映射使能AFIO时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//只关闭JTAG而保留SWD
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,DISABLE);  //重映射失能AFIO时钟
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    WHT_Debug_Driver.WHT_Init(DEBUG_Serial_Baud_Rate);     //debug串口初始化

    //WHT_WWDG_BSP.WHT_Config(&WWDG_Config);
}



static void App_Start(void)
{
    // 在APP的main()最开始处添加（需放在任何中断启用之前）
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); // 对应16KB Bootloader偏移
    //或者
    SCB->VTOR = FLASH_BASE | 0x4000; // 重定向向量表

    // 在跳转到APP前（Bootloader中已做），APP需确保：
    __disable_irq();
    HAL_RCC_DeInit();  // 复位RCC
    SysTick->CTRL = 0; // 关闭SysTick
    // 其他外设DeInit...

    // APP中可检测是否由Bootloader跳转而来
    if((RCC->CSR & RCC_CSR_SFTRSTF) != 0)
    {
        // 软件复位情况处理
        RCC->CSR |= RCC_CSR_RMVF; // 清除复位标志
    }
}



int main(void)
{
    Hardware_Init();//先初始化硬件
    
    // 检查是否进入Bootloader模式
    if(Check_Bootloader_Mode() == true)
    {
        In_bootloader_mode:
        WHT_Debug_Driver.WHT_Init(DEBUG_Serial_Baud_Rate);//串口初始化
        printf("In Bootloader Mode\r\n");
        Handle_Bootloader();
    }
    // 否则尝试跳转到应用程序
    else if(Check_APP_Valid() == true)
    {
        Jump_To_APP();
    }
    
    // 如果应用程序无效，则停留在Bootloader
    goto In_bootloader_mode;
}


